<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>02_执行上下文</title>
</head>
<body>
<!-- 
1、代码分类（位置）
    * 全局代码
    * 函数代码
2、全局执行上下文
    * 在执行全局代码前将window确定为全局执行上下文
    * 对全局数据进行预处理
        * var定义的全局变量 ==> undefined，添加为window的属性
        * function声明的全局函数 ==> 赋值（fun），添加为window的方法
        * this ==> 赋值（window）
    * 开始执行全局代码
3、函数执行上下文
    * 在调用函数，准备执行函数体之前，创建对应的函数执行上下文对象
    * 对局部数据进行预处理
        * 形参变量 ==> 赋值（实参）==> 添加为执行上下文的属性
        * arguments ==> 赋值（实参列表）==> 添加为执行上下文的属性
        * var定义的局部变量 ==> 赋值（undefined） ==> 添加为执行上下文的属性
        * function声明的函数 ==> 赋值（fun）==> 添加为执行上下文的属性
        * this ==> 赋值（调用函数的对象）
    * 开始执行函数体代码
-->
<script>
console.log(a1)
a2()
console.log(this)


var a1 = 3
function a2() {
    console.log('a2')
}

function fn(a1) {
    console.log(a1) // 2
    console.log(a2) // undefined
    a3() // a3()
    console.log(this) // window
    console.log(arguments) // 伪数组（2,3）

    var a2 = 3
    function a3() {
        console.log("a3()")
    }
}

fn(2, 3)
</script>
</body>
</html>